#include "msgQueue.h"
#include "client.h"
#include "tools.h"
#include "bank.h"

//通信消息
ClientToServe ctos;
ServeToClient stoc;

//消息队列ID
int stocMsgId = 0;
int ctosMsgId = 0;

//主菜单
void mainMenu(void)
{
	puts("******欢迎使用goran银行******");
	puts("1、开户			2、登录");
	puts("3、销户			4、解锁");
	puts("0、退出");
}

//开户
void openAccount(void)
{
	ctos.type = M_OPEN;
	printf("请输入身份证号：");
	getStr(ctos.acc.IdCard,IDCARD_LEN);
	printf("请输入开户金额：");
	scanf("%f",&ctos.acc.balance);
}

//登录
void login(void)
{
	ctos.type = M_LOGIN;
	printf("请输入银行卡号：");
	getStr(ctos.acc.bank,BANK_LEN);
	printf("请输入密码：");
	getPassword(ctos.acc.password,PASS_WORD_LEN,true);

	//向服务端发送信息
	sendMsg(ctosMsgId,&ctos,sizeof(ctos));

	//从服务端接收消息
	receiveMsg(stocMsgId,&stoc,sizeof(stoc));

	if('Y' != stoc.info[0])
	{
		//显示服务端执行的结果
		puts(stoc.info);
		anykeyContinue();
		return;
	}

	while(true)
	{
		subMenu();
		switch(getCmd('1','6')-'0'+4)//存款取款等功能对应的消息类型
		{
			case M_SAVE:	save();				break;//存款
			case M_TAKE:	take();				break;//取款
			case M_QUERY:	query();			break;//查询
			case M_TRANSFER:transfer();			break;//转账
			case M_REPASS:	resetPassword();	break;//改密
			default: exit(EXIT_SUCCESS);		break;//退出
		}

	//向服务端发送信息
	sendMsg(ctosMsgId,&ctos,sizeof(ctos));

	//从服务端接收消息
	receiveMsg(stocMsgId,&stoc,sizeof(stoc));

	//显示服务端执行的结果
	puts(stoc.info);
	anykeyContinue();
	}
}

//销户
void destroy(void)
{
	ctos.type = M_DESTROY;
	printf("请输入银行卡号：");
	getStr(ctos.acc.bank,BANK_LEN);
	printf("请输入身份证号：");
	getStr(ctos.acc.IdCard,IDCARD_LEN);
	printf("请输入密码：");
	getPassword(ctos.acc.password,PASS_WORD_LEN,true);
}

//解锁
void unlock(void)
{
	ctos.type = M_UNLOCK;
	printf("请输入银行卡号：");
	getStr(ctos.acc.bank,BANK_LEN);
	printf("请输入身份证号：");
	getStr(ctos.acc.IdCard,IDCARD_LEN);
	printf("请输入密码：");
	getPassword(ctos.acc.password,PASS_WORD_LEN,true);
}

//子菜单
void subMenu(void)
{
	puts("******恭喜您登录成功******");
	puts("1、存款		2、取款");
	puts("3、查询		4、转账");
	puts("5、改密		6、退出");
}

//存款
void save(void)
{
	ctos.type = M_SAVE;
	printf("请输入存款金额：");
	scanf("%f",&ctos.acc.balance);
}

//取款
void take(void)
{
	ctos.type = M_TAKE;
	printf("请输入取款金额：");
	scanf("%f",&ctos.acc.balance);
}

//查询
void query(void)
{
	ctos.type = M_QUERY;
}

//转账
void transfer(void)
{
	ctos.type = M_TRANSFER;
	printf("请输入目标银行卡号：");
	getStr(ctos.acc.bank,BANK_LEN);
	printf("请输入转账金额：");
	scanf("%f",&ctos.acc.balance);
}

//改密
void resetPassword(void)
{
	char password1[10] = {},password2[10] = {};
	printf("请输入新密码：");
	getPassword(password1,PASS_WORD_LEN,true);
	printf("请再次输入新密码：");
	getPassword(password2,PASS_WORD_LEN,true);
	if(strcmp(password1,password2))
	{
		puts("两次输入的密码不相同，修改失败！");
	}
	else
	{
		ctos.type = M_REPASS;
		strcpy(ctos.acc.password,password1);
	}
}

int main()
{
	//获取两个消息队列
	stocMsgId = getMsg(STOC_KEY);
	ctosMsgId = getMsg(CTOS_KEY);

	//确定返回的消息类型
	ctos.pid = stoc.type = getpid();

	while(true)
	{
		mainMenu();

		//负责准备要发送的消息
		switch(getCmd('0','7')-'0')
		{
			case M_EXIT:	return 0;		break;		//退出
			case M_OPEN:	openAccount();	break;		//开户
			case M_LOGIN:	login();		continue;	//登录
			case M_DESTROY:	destroy();		break;		//销户
			case M_UNLOCK:	unlock();		break;		//解锁
		}

		//向服务器发送消息
		sendMsg(ctosMsgId,&ctos,sizeof(ctos));

		//从服务器接收消息
		receiveMsg(stocMsgId,&stoc,sizeof(stoc));

		//显示服务器执行的结果
		puts(stoc.info);
		anykeyContinue();
	}
}
